//package com.sloan.community.controller;
//
//import com.sloan.community.po.Article;
//import com.sloan.community.po.Tag;
//import com.sloan.community.po.TagParent;
//import com.sloan.community.po.User;
//import com.sloan.community.repository.ArticleRepository;
//import com.sloan.community.repository.TagParentRepository;
//import com.sloan.community.repository.TagRepository;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.server.WebSession;
//import reactor.core.publisher.Mono;
//
//import java.time.Duration;
//import java.util.Objects;
//
//import static com.sloan.community.common.CommunityConstant.SESSION_USER;
//
//@RestController
//public class TestController {
//
//    @Autowired
//    private TagRepository tagRepository;
//
//    @Autowired
//    private TagParentRepository tagParentRepository;
//
//    @Autowired
//    private ArticleRepository articleRepository;
//
//    @Transactional(rollbackFor = Exception.class)
//    @GetMapping("test/{id}")
//    public Mono<Void> test(@PathVariable("id") Long id, WebSession webSession) {
//        User user = new User();
//        user.setId(10L);
//        webSession.getAttributes().put(SESSION_USER,user);
//
//        Mono<Article> articleMono = articleRepository.findById(id)
//                .delayElement(Duration.ofSeconds(3)) // 这样流虽然延迟了，但是依旧还是保持事务的，
//                .switchIfEmpty(Mono.error(new RuntimeException("文章不存在" + id)));
//
//        TagParent tagParent = new TagParent();
//        tagParent.setName("test-parent");
//
//        Mono<TagParent> save = tagParentRepository.save(tagParent);
//
//        Tag tag = new Tag();
//        tag.setName("test");
//        tag.setParentId(tagParent.getId());
//
//        Mono<Tag> save1 = tagRepository.save(tag);
//
//        return save.flatMap(tp->{
//            Tag tag1 = new Tag();
//            tag1.setName("test222");
//            tag1.setParentId(tp.getId());
//            int i=1/0;
//            return tagRepository.save(tag1); // 没有 @Transactional 注解不能保证事务
//        }).then();
//
//        // 这里when会把articleMono的delayElement效果给清除???从而下面两个流就不执行了，事务直接回滚
////       return Mono.when(articleMono)
////                .then(Mono.zip(save,save1))
////                .then();
//
////        return Mono.zip(save,save1,articleMono) // @Transactional(rollbackFor = Exception.class)是必要的，保证事务
////                .then();
//
////        // 哪个流在zip的越靠前就越先执行谁,其中如果有一个流出错，照样保证事务，不管其中一个流是不是延迟了，也照样保证事务
////        return Mono.zip(save, save1,articleMono)
////                .then();
//
//    }
//}
